package engine

import "learngo/crawler/config"

type ParserResult struct {
	Requests []Request
	Items []Item
}

type Item struct {
	Url     string
	Type    string
	Id      string
	Payload interface{}
}

type NilParser struct{}


func (NilParser) Parse(_ []byte, _ string) ParserResult {
	return ParserResult{}
}

func (NilParser) Serialize() (
	name string, args interface{}) {
	return config.NilParser, nil
}

//Parser是一个接口，里面有Parse和Serialize两个方法
type Request struct {
	Url    string
	Parser Parser
}

type Parser interface {
	Parse(contents []byte, url string) ParserResult
	Serialize() (name string, args interface{})
}


//FuncParser中的Parse方法和Serialize方法，和Parser接口的的方法对应
func (f *FuncParser) Parse(contents []byte, url string) ParserResult {
	return f.parser(contents, url)
}
func (f *FuncParser) Serialize() (name string, args interface{}) {
	return f.name, nil
}


type ParserFunc func(contents []byte, url string) ParserResult
type FuncParser struct {
	parser ParserFunc
	name   string
}
//用到上面定义的ParserFunc和FuncParser
//ParserFunc对应到citylist.go和city.go,profile.go中的ParserXXX方法
//FuncParser有两个变量，一个是parser，一个是name
//FuncParser也有Serialize()方法 ->(f *FuncParser) Serialize() (name string, args interface{})
//如果FuncParser实现了Serialize() -> (name string, args interface{})
//FuncParser也实现了Parse() -> (contents []byte, url string) ParserResult
//那么FuncParser就是现实现了Parser接口
func NewFuncParser(p ParserFunc, name string) *FuncParser {
	return &FuncParser{
		parser: p,
		name:   name,
	}
}



